using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

using tp1.Entidades;

namespace tp1.Escena
{
    enum DireccionHelicoptero { Derecha, Izquierda, Arriba, Abajo };

    class Helicoptero
    {
        private Punto centro = new Punto(1300, 450);
        private Punto puntoSuelo;
        private Punto limiteIA;
        private Punto limiteDB;
        private double angulo = 0;
        private double anguloAspa = 90;
        private double anguloGancho = 45; // de 0 a 45
        private double largoCable = 200;
        private Caja cajaSujeta = null;



        public Helicoptero(Punto limiteIA, Punto limiteDB, Punto puntoSuelo)
        {
            this.limiteDB = limiteDB;
            this.limiteIA = limiteIA;
            this.puntoSuelo = puntoSuelo;
        }

        #region Propiedades
        public Punto LimiteIA
        {
            get { return limiteIA; }
        }

        public Punto LimiteDB
        {
            get { return limiteDB; }
        }

        public Caja CajaSujeta
        {
            get { return cajaSujeta; }
        }

        public double Angulo
        {
            set { angulo = value; }
            get { return angulo; }
        }

        public double AnguloAspa
        {
            set { anguloAspa = value; }
            get { return anguloAspa; }
        }

        public Punto Centro
        {
            get { return centro; }
            set { centro = value; }
        }

        public Punto Gancho
        {
            get { return new Punto(centro.X, centro.Y - largoCable - 30); }
        }
        #endregion

        public void MoverAspas()
        {
            anguloAspa = (anguloAspa + 50) % 360;
        }

        public void AbrirCerrarGancho(List<Caja> listaCajas)
        {
            if (anguloGancho == 0)
            {
                anguloGancho = 45;

                if (cajaSujeta != null)
                {
                    cajaSujeta.Sujeta = false;
                    cajaSujeta = null;
                }
            }
            else
            {
                anguloGancho = 0;
                foreach (Caja caja in listaCajas)
                {
                    if (caja.HitTest(Gancho))
                    {
                        cajaSujeta = caja;
                        cajaSujeta.Sujeta = true;
                        break;
                    }
                }
            }
        }

        public void SubirCable()
        {
            double limiteMin = 0;
            if (cajaSujeta != null)
            {
                limiteMin = 50;
            }

            largoCable = largoCable - 2;
            if (largoCable < limiteMin)
            {
                largoCable = limiteMin;
            }
            if (cajaSujeta != null && largoCable != limiteMin)
            {
                cajaSujeta.Centro.Y += 2;
            }

        }

        public void BajarCable()
        {
            if (cajaSujeta != null)
            {
                if (cajaSujeta.CajaEnSuelo(puntoSuelo))
                    return;
            }

            if (Gancho.Y <= puntoSuelo.Y)
            {
                return;
            }

            largoCable = largoCable + 2;
            if (largoCable > 400)
            {
                largoCable = 400;
            }
            if (cajaSujeta != null)
            {
                cajaSujeta.Centro.Y -= 2;
            }
        }

        public void Dibujar()
        {
            double distanciaAlSuelo = centro.Y - limiteDB.Y + 150;
            if (largoCable > distanciaAlSuelo)
            {
                largoCable = distanciaAlSuelo;
            }

            if (largoCable > distanciaAlSuelo - 30)
            {
                largoCable = distanciaAlSuelo - 30;
            }

            Pipeline.CargarIdentidad();
            Pipeline.Trasladar(centro.X, centro.Y);
            DibujarCable();
            DibujarGancho();
            Pipeline.PushM();
            Pipeline.Rotar(angulo);
            DibujarCola();
            DibujarCabina();
            DibujarSoporte();
            DibujarAspas();
            Pipeline.PopM();
        }

        private void DibujarCola()
        {
            Pipeline.LineColor(Color.Black);
            Pipeline.FillColor(Color.LightSlateGray);

            List<Punto> lista = new List<Punto>();
            lista.Add(new Punto(30, -15));
            lista.Add(new Punto(30, 15));
            lista.Add(new Punto(120, 5));
            lista.Add(new Punto(135, 25));
            lista.Add(new Punto(145, 25));
            lista.Add(new Punto(130, -15));
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
        }

        private void DibujarCable()
        {
            Pipeline.LineColor(Color.Black);
            Pipeline.FillColor(Color.DarkSlateBlue);
            Pipeline.FillColor(Color.DarkGray);

            List<Punto> lista = new List<Punto>();
            lista.Add(new Punto(-2, 0));
            lista.Add(new Punto(2, 0));
            lista.Add(new Punto(2, -largoCable));
            lista.Add(new Punto(-2, -largoCable));
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
        }

        private void DibujarGancho()
        {
            Pipeline.LineColor(Color.Black);
            Pipeline.FillColor(Color.Goldenrod);

            List<Punto> lista = new List<Punto>();
            lista.Add(new Punto(-10, 0));
            lista.Add(new Punto(10, 0));
            lista.Add(new Punto(6, -10));
            lista.Add(new Punto(-6, -10));
            Pipeline.PushM();
            Pipeline.Trasladar(0, -largoCable);
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
            Pipeline.PopM();

            lista.Clear();
            lista.Add(new Punto(-10, -10));
            lista.Add(new Punto(0, -10));
            lista.Add(new Punto(0, -30));
            lista.Add(new Punto(-10, -25));
            Pipeline.PushM();
            Pipeline.Trasladar(0, -largoCable);
            Pipeline.Rotar(-anguloGancho);
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
            Pipeline.PopM();
            Pipeline.PushM();
            Pipeline.Trasladar(0, -largoCable);
            Pipeline.Escalar(-1, 1);
            Pipeline.Rotar(-anguloGancho);
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
            Pipeline.PopM();
        }

        private void DibujarCabina()
        {
            Pipeline.LineColor(Color.Black);

            List<Punto> lista = new List<Punto>();
            lista.Add(new Punto(0, 0));
            lista.Add(new Punto(50, 0));
            Pipeline.PushM();
            Pipeline.Escalar(1, 0.75);
            Pipeline.Dibujar(Tipo.CIRCULO, lista);
            Pipeline.PopM();

            Pipeline.FillColor(Color.LightBlue);
            lista.Clear();
            lista.Add(new Punto(0, 0));
            lista.Add(new Punto(0, 52));
            lista.Add(new Punto(-22, 45));
            lista.Add(new Punto(-32, 40));
            lista.Add(new Punto(-38, 35));
            lista.Add(new Punto(-42, 30));
            lista.Add(new Punto(-45, 25));
            lista.Add(new Punto(-48, 20));
            lista.Add(new Punto(-50, 15));
            lista.Add(new Punto(-52, 10));
            lista.Add(new Punto(-52, 5));
            lista.Add(new Punto(-52, 0));
            Pipeline.PushM();
            Pipeline.Escalar(1, 0.75);
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
            Pipeline.PopM();
        }

        private void DibujarSoporte()
        {
            Pipeline.LineColor(Color.Black);
            Pipeline.FillColor(Color.Black);

            List<Punto> lista = new List<Punto>();
            lista.Add(new Punto(-15, -25));
            lista.Add(new Punto(-12, -28));
            lista.Add(new Punto(-29, -48));
            lista.Add(new Punto(-32, -45));
            Pipeline.Dibujar(Tipo.POLIGONO, lista);

            lista.Clear();
            lista.Add(new Punto(15, -25));
            lista.Add(new Punto(12, -28));
            lista.Add(new Punto(29, -48));
            lista.Add(new Punto(32, -45));
            Pipeline.Dibujar(Tipo.POLIGONO, lista);

            lista.Clear();
            lista.Add(new Punto(-45, -45));
            lista.Add(new Punto(-45, -48));
            lista.Add(new Punto(45, -48));
            lista.Add(new Punto(45, -45));
            Pipeline.Dibujar(Tipo.POLIGONO, lista);
        }

        private void DibujarAspas()
        {
            Pipeline.LineColor(Color.Black);
            Pipeline.FillColor(Color.Silver);

            List<Punto> listaAspa = new List<Punto>();
            listaAspa.Add(new Punto(-3, 25));
            listaAspa.Add(new Punto(3, 25));
            listaAspa.Add(new Punto(-3, -25));
            listaAspa.Add(new Punto(3, -25));
            Pipeline.PushM();
            Pipeline.Trasladar(125, -5);
            Pipeline.Rotar(anguloAspa);
            Pipeline.Dibujar(Tipo.POLIGONO, listaAspa);

            Pipeline.FillColor(Color.Gray);
            List<Punto> listaRotor = new List<Punto>();
            listaRotor.Add(new Punto(0, 0));
            listaRotor.Add(new Punto(3, 0));
            Pipeline.Dibujar(Tipo.CIRCULO, listaRotor);
            Pipeline.PopM();

            Pipeline.PushM();
            Pipeline.Trasladar(0, 40);
            Pipeline.Escalar(1, 0.25);
            Pipeline.Rotar(anguloAspa);
            Pipeline.Escalar(2, 5);
            Pipeline.FillColor(Color.Silver);
            Pipeline.Dibujar(Tipo.POLIGONO, listaAspa);
            Pipeline.FillColor(Color.Gray);
            Pipeline.Dibujar(Tipo.CIRCULO, listaRotor);
            Pipeline.PopM();
        }
    }
}
